package com.wasion.gydpe.common.util;


/**
 * 
 * @ClassName: ConvertInXBaseUtil
 * @Description: 基于2,10,16进制的数据转换工具
 * @author 高意
 * @date Aug 28, 2012 2:50:33 PM
 * 
 */
public class ConvertInXBaseUtil {

	/**
	 * 二进制串 -> 十进制
	 * 
	 * @param strBinary为二进制串
	 * 
	 * @return 十进制数
	 * @eg: strBinary = 01010101 ----> return 85
	 */
	public static int binary2Decimal(String strBinary) {

		int iDec = 0;
		for (int i = 0; i < strBinary.length(); i++) {
			int temp = Integer.parseInt(strBinary.substring(strBinary.length()
					- (i + 1), strBinary.length() - i));
			iDec += (int) Math.pow(2, i) * temp;
		}

		return iDec;
	}

	/**
	 * 二进制串 -> 十六进制
	 * 
	 * @param strBinary为二进制串
	 * 
	 * @return 十六进制数
	 * @eg: strBinary = 01010101 ----> return 55
	 */
	public static String binary2Hex(String strBinary) {

		int iDec = binary2Decimal(strBinary);

		return decimal2Hex(iDec, true);
	}

	/**
	 * 二进制 长串 -> 十六进制
	 * 
	 * @param strBinary为二进制串,
	 *            length为分割的长度
	 * 
	 * @return 十六进制数
	 * @eg:strBinary = 10101 01010101 00010101 01010100 01010101 -----> return
	 *               15 55 15 54 55
	 */
	public static String longBinary2Hex(String strBinary, int length) {

		String strHex = "";
		for (int i = strBinary.length(); i > 0; i -= length) {

			String tString = "";
			if (i / length == 0) {
				tString = strBinary.substring(0, i);
			} else {
				tString = strBinary.substring(i - length, i);
			}
			strHex = binary2Hex(tString) + strHex;
		}

		return strHex;
	}

	/**
	 * 二进制 长串 -> 十六进制
	 * 
	 * @param strBinary为二进制串,
	 *            length为分割的长度，分割长度为8
	 * 
	 * @return 十六进制数
	 * @eg:strBinary = 10101 01010101 00010101 01010100 01010101 -----> return
	 *               15 55 15 54 55
	 */
	public static String longBinary2Hex(String strBinary) {

		return longBinary2Hex(strBinary, 8);
	}

	/**
	 * 十进制 -> 二进制
	 * 
	 * @param decNum为十进制数,
	 *            isCovering位数是否补齐8 4 2
	 * 
	 * @return 二进制字符串
	 * @eg:int decNum = 18 ----> return 0001 0010(按照每四位补齐)
	 */
	public static String decimal2Binary(int decNum, boolean isCovering) {

		String strBin = Integer.toBinaryString(decNum);

		if (!isCovering || strBin.length() % 8 == 0)
			return strBin;

		int les = 4 - strBin.length() % 4;
		String temp = "";
		for (int i = 0; i < les; i++) {
			temp += "0";
		}

		return temp + strBin;
	}

	/**
	 * 十进制 -> 十六进制(补齐2位)
	 * 
	 * @param decNum为十进制数,
	 *            isCovering位数是否补齐8 4 2
	 * 
	 * @return 长度为2位的十六进制字符串
	 * @eg: decNum = 85 ----> return 55
	 * @eg: decNum = 5 ----> return 05
	 */
	public static String decimal2Hex(int decNum, boolean isCovering) {

		String strHex = Integer.toHexString(decNum);

		if (!isCovering)
			return strHex;

		strHex = strHex.length() % 2 == 1 ? "0" + strHex : strHex;

		return strHex;
	}

	/**
	 * 十六进制 -> 十进制
	 * 
	 * @param strHex为的十六进制串
	 * 
	 * @return 十进制数
	 * @eg: byteNum = 55 ----> return 85
	 */
	public static int hex2Decimal(String strHex) {

		return Integer.valueOf(strHex, 16);
	}

	/**
	 * 十六进制 -> 二进制
	 * 
	 * @param strHex为的十六进制串,
	 *            isCovering位数是否补齐8 4 2
	 * 
	 * @return 二进制数
	 * @eg: byteNum = 55 ----> return 85
	 */
	public static String hex2Binary(String strHex, boolean isCovering) {

		int iDec = hex2Decimal(strHex);

		return decimal2Binary(iDec, isCovering);
	}

	/**
	 * byte -> 十进制
	 * 
	 * @param byteNum为类型为byte的十进制数
	 * 
	 * @return 十进制数
	 * @eg: byteNum = -128 ----> return 128
	 * @eg: byteNum = 44 ----> return 44 *
	 * @eg: byteNum = -1 ----> return 255
	 */
	public static int byte2Decimal(byte byteNum) {

		String strHex = Integer.toHexString(byteNum & 0xFF);
		strHex = strHex.length() == 1 ? "0" + strHex : strHex;

		return Integer.valueOf(strHex, 16);
	}

	/**
	 * 16进制串转换成二进制数组
	 */
	public static byte[] hexString2ByteArray(String s) {
		int len = s.length();
		byte[] data = new byte[len / 2];
		for (int i = 0; i < len; i += 2) {
			data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
					.digit(s.charAt(i + 1), 16));
		}
		return data;
	}
}
